package com.jprocms.module.cms.util;


import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 大文本字符串关键词替换工具类
 * 提供高效的批量关键词替换功能，支持普通替换和正则表达式替换
 */
public class TextReplacer {

    /**
     * 使用Map批量替换文本中的关键词 替换的如果是url 自动拼接 <a href="url" target="_blank">关键词</a>
     * 适用于处理较大文本和多个替换项的情况
     *
     * @param text         原始文本
     * @param replacements 包含关键词和替换值的Map
     * @return 替换后的文本
     */
    public static String replaceKeywords(String text, Map<String, String> replacements) {
        if (text == null || text.isEmpty() || replacements == null || replacements.isEmpty()) {
            return text;
        }

        // 构建正则表达式模式，匹配所有需要替换的关键词
        StringBuilder patternBuilder = new StringBuilder();
        for (String key : replacements.keySet()) {
            if (patternBuilder.length() > 0) {
                patternBuilder.append("|");
            }
            // 转义特殊字符，确保作为普通文本匹配
            patternBuilder.append(Pattern.quote(key));
        }

        Pattern pattern = Pattern.compile(patternBuilder.toString());
        Matcher matcher = pattern.matcher(text);

        // 使用StringBuffer高效构建结果
        StringBuffer result = new StringBuffer();
        while (matcher.find()) {
            // 替换找到的关键词
            final String group = matcher.group();
            matcher.appendReplacement(result, replacements.get(group));
        }
        matcher.appendTail(result);

        return result.toString();
    }

    /**
     * 替换文本中的单个关键词
     *
     * @param text        原始文本
     * @param keyword     要替换的关键词
     * @param replacement 替换值
     * @return 替换后的文本
     */
    public static String replaceKeyword(String text, String keyword, String replacement) {
        if (text == null || text.isEmpty() || keyword == null || keyword.isEmpty()) {
            return text;
        }

        return text.replace(keyword, replacement);
    }

    /**
     * 使用正则表达式替换文本内容
     *
     * @param text        原始文本
     * @param regex       正则表达式
     * @param replacement 替换值
     * @return 替换后的文本
     */
    public static String replaceWithRegex(String text, String regex, String replacement) {
        if (text == null || text.isEmpty() || regex == null || regex.isEmpty()) {
            return text;
        }

        return text.replaceAll(regex, replacement);
    }

    /**
     * 处理超大文本的替换方法，适用于内存敏感场景
     * 注意：此方法返回的是处理后的字符串，如果文本过大仍可能导致内存问题
     * 更优的超大文本处理应使用流(Stream)方式
     *
     * @param largeText    超大文本
     * @param replacements 替换映射
     * @return 替换后的文本
     */
    public static String replaceInLargeText(String largeText, Map<String, String> replacements) {
        // 对于非常大的文本，可以考虑分块处理
        // 这里简化处理，实际应用中可根据需要实现分块逻辑
        return replaceKeywords(largeText, replacements);
    }
}
